package main

import (
	"fmt"
	"path/filepath"

	"gitee.com/love_bass/go-torrent/torrent"
)

func main() {
	torrentTest()
}

// torrentTest 种子文件生成和校验的测试函数
func torrentTest() {
	// 新逻辑：不再使用配置结构体，在生成种子时指定块大小
	// 设置每个数据块的大小为256KB
	pieceLength := 256 * 1024
	// 创建种子管理器实例
	torrentNamager := torrent.NewTorrentManager()

	// 假设要生成种子的目录，例如 Windows 路径 "E:\\123pan"
	// 注意这里用斜杠也行，Go 会自动转换
	dir := `E:\123pan`

	fmt.Println("=== 开始生成种子文件 ===")

	// 1. 生成种子文件，根路径为目录名，不使用绝对路径，改为通道显示进度
	fmt.Println("正在扫描文件并计算哈希值...")
	// 创建进度通道，用于接收生成进度
	genProgress := make(chan float64, 1)
	// 创建完成信号通道
	doneGen := make(chan struct{})
	// 启动协程显示生成进度
	go func() {
		last := -1
		for progress := range genProgress {
			percentage := int(progress * 100)
			if percentage > 100 {
				percentage = 100
			}
			// 只在有变化时输出，减少刷新
			if percentage != last {
				fmt.Printf("\r生成进度: %d%% [", percentage)
				for i := 0; i < 50; i++ {
					if i < int(progress*50) {
						fmt.Print("=")
					} else {
						fmt.Print(" ")
					}
				}
				fmt.Print("]")
				last = percentage
			}
		}
		fmt.Println() // 完成时换行
		close(doneGen)
	}()

	// 调用种子生成函数，传入目录路径、块大小和进度通道
	meta, err := torrentNamager.GenerateTorrentWithProgress(dir, pieceLength, genProgress)
	<-doneGen // 等待进度输出完成，避免goroutine泄漏
	if err != nil {
		fmt.Printf("生成种子文件失败: %v\n", err)
		return
	}
	fmt.Printf("种子生成完成！目录: %s (根路径: %s)\n", dir, meta.RootPath)
	fmt.Printf("总文件数: %d, 总大小: %.2f MB\n", len(meta.Files), float64(meta.TotalLength)/(1024*1024))

	// 3. 编码种子文件为二进制数据并将种子文件写入磁盘
	torrentFile := "example.torrent"
	if err := torrentNamager.SaveTorrent(meta, torrentFile); err != nil {
		fmt.Printf("保存种子文件失败: %v\n", err)
		return
	}
	fmt.Printf("种子文件已保存到: %s\n", torrentFile)

	// 4. 读取种子文件数据并解码种子文件
	meta2, err := torrentNamager.LoadTorrent(torrentFile)
	if err != nil {
		fmt.Printf("读取种子文件失败: %v\n", err)
		return
	}

	fmt.Printf("种子文件解码成功: %s\n", torrentFile)

	fmt.Println("\n=== 开始校验种子文件 ===")

	// 6. 校验目录，传入上一级目录，校验函数内部拼播种子根目录完成扫描校验
	// 获取目标目录的父目录路径
	parentDir := filepath.Dir(dir)
	fmt.Println("正在校验文件完整性...")

	// 创建校验进度通道
	verifyProgress := make(chan float64, 1)
	// 创建校验完成信号通道
	doneVerify := make(chan struct{})
	// 启动协程显示校验进度
	go func() {
		last := -1
		for progress := range verifyProgress {
			percentage := int(progress * 100)
			if percentage > 100 {
				percentage = 100
			}
			if percentage != last {
				fmt.Printf("\r校验进度: %d%% [", percentage)
				for i := 0; i < 50; i++ {
					if i < int(progress*50) {
						fmt.Print("=")
					} else {
						fmt.Print(" ")
					}
				}
				fmt.Print("]")
				last = percentage
			}
		}
		fmt.Println()
		close(doneVerify)
	}()

	// 调用种子校验函数，传入种子元数据、父目录路径和进度通道
	result, err := torrentNamager.VerifyTorrentWithProgress(meta2, parentDir, verifyProgress)
	<-doneVerify
	if err != nil {
		fmt.Printf("校验种子文件失败: %v\n", err)
		return
	}

	// 显示校验结果
	if len(result.MissingFiles) == 0 && len(result.ExtraFiles) == 0 {
		fmt.Println("✅ 校验通过：所有文件都与种子元数据匹配")
	} else {
		if len(result.MissingFiles) > 0 {
			fmt.Printf("❌ 需要重新下载的文件 (%d个):\n", len(result.MissingFiles))
			for _, f := range result.MissingFiles {
				fmt.Printf("  - %s\n", f)
			}
		}

		if len(result.ExtraFiles) > 0 {
			fmt.Printf("🗑️  需要删除的多余文件 (%d个):\n", len(result.ExtraFiles))
			for _, f := range result.ExtraFiles {
				fmt.Printf("  - %s\n", f)
			}
		}
	}

	// 清理示例产生的种子文件（可选）
	// defer os.Remove(torrentFile)
}
